home *** CD-ROM | disk | FTP | other *** search
/ PC Elektro 3 / PC-Elektro-3-cd1.bin / KBan 2.0 / KBANSRC.LZH / SRC / PROG / CMD / EDPULL.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-24  |  2.9 KB  |  107 lines

  1. /*
  2.  * the class EDIT_PULL
  3.  * Copyright (C) 1996, 1997 Kazutaka Hirata <khirata@jove.acs.unt.edu>
  4.  */
  5.  
  6. #include "../stdafx.h"
  7.  
  8. #include "../common/bool.h"
  9. #include "edpull.h"
  10.  
  11. #include "edpull.h"
  12.  
  13. STAGE* EDIT_PULL::init_new(KBAN_INFO& info, KBAN_DRAW& draw)
  14. {
  15.   return new STAGE_SELECT;
  16. }
  17.  
  18. const char* EDIT_PULL::get_name(void)
  19. {
  20.   return "Edit:Pull";
  21. }
  22.  
  23. void EDIT_PULL::STAGE_SELECT::collect_pull_lines(const XY& ac_target, LINE_LIST& llist, LINE_P_LIST& plist)
  24. {
  25.   LINE_LIST::iterator i;
  26.   TRAVERSE(llist, i) {
  27.     if((ac_target == i->ac_s()) || (ac_target == i->ac_e())) {
  28.       LINE_ELEMENT_P element(&*i);
  29.       plist.push_back(element);
  30.     }
  31.   }
  32. }
  33.  
  34. STAGE* EDIT_PULL::STAGE_SELECT::mouse_left_down(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
  35. {
  36.   PRIMITIVE& primitive = info.kban_data().primitive();
  37.   LINE_LIST& line_list = primitive.layer(info.active_layer().get()).line_list();
  38.   XY ac;
  39.   GRID& grid = info.grid();
  40.   grid.xy_pc2ac_with_snap_off(pc, ac);
  41.   STAGE* ret = this;
  42.  
  43.   // can I pull?
  44.   for(XYT pc_eps = 0; pc_eps < 20; pc_eps++) {
  45.     XYT ac_eps = grid.distance_pc2ac(pc_eps);
  46.     if(line_list.is_there_nearest_point(ac_eps, ac)) {
  47.       XY ac_target = line_list.search_nearest_point(ac_eps, ac);
  48.       LINE_P_LIST plist;
  49.       collect_pull_lines(ac_target, line_list, plist);
  50.       ret = new STAGE_PULL(ac_target, info.active_layer().get(), plist);
  51.       break;
  52.     }
  53.   }
  54.  
  55.   if(ret == this) {
  56.     // can I divide?
  57.     XYT eps = grid.distance_pc2ac(20);
  58.     LINE_ELEMENT* target = line_list.search(eps, ac);
  59.     if(target != NULL) {
  60.       ret = new STAGE_DIVIDE(target, info.active_layer().get());
  61.     } else {
  62.       ret = this;
  63.     }
  64.   }
  65.  
  66.   return ret;
  67. }
  68.  
  69. STAGE* EDIT_PULL::STAGE_SELECT::mouse_right_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
  70. {
  71.   return NULL;
  72. }
  73.  
  74. EDIT_PULL::STAGE_PULL::STAGE_PULL(const XY &ac, uint layer, const LINE_P_LIST& list)
  75.   : STAGE_PULL_CORE(ac, layer, list)
  76. {
  77. }
  78.  
  79. STAGE* EDIT_PULL::STAGE_PULL::mouse_left_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
  80. {
  81.   STAGE_PULL_CORE::mouse_left_up(info, draw, pc, nFlags);
  82.   return new STAGE_SELECT;
  83. }
  84.  
  85. STAGE* EDIT_PULL::STAGE_PULL::mouse_right_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
  86. {
  87.   STAGE_PULL_CORE::mouse_right_up(info, draw, pc, nFlags);
  88.   return new STAGE_SELECT;
  89. }
  90.  
  91. EDIT_PULL::STAGE_DIVIDE::STAGE_DIVIDE(LINE_ELEMENT* target, uint layer)
  92.   : STAGE_DIVIDE_CORE(target, layer)
  93. {
  94. }
  95.  
  96. STAGE* EDIT_PULL::STAGE_DIVIDE::mouse_left_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
  97. {
  98.   STAGE_DIVIDE_CORE::mouse_left_up(info, draw, pc, nFlags);
  99.   return new STAGE_SELECT;
  100. }
  101.  
  102. STAGE* EDIT_PULL::STAGE_DIVIDE::mouse_right_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
  103. {
  104.   STAGE_DIVIDE_CORE::mouse_right_up(info, draw, pc, nFlags);
  105.   return new STAGE_SELECT;
  106. }
  107.